import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;

public class Main {
    public static void main1(String[] args) {
        MyThread t1 = new MyThread();
        t1.start();

        MyThread t2 = new MyThread();
        t2.start();

        for(int i = 5; i >= 1; i--){
            System.out.println(Thread.currentThread().getName()+" 线程："+ i);
        }
    }

    public static void main2(String[] args) {
        MyThread1 my = new MyThread1();
        new Thread(my).start();
        new Thread(my).start();

        for(int i = 5; i >= 1; i--){
            System.out.println(Thread.currentThread().getName()+" 线程："+ i);
        }
    }

    public static void main3(String[] args) {
        MyThread2 t1 = new MyThread2();
        t1.start();
        MyThread2 t2 = new MyThread2();
        t2.start();
        MyThread2 t3 = new MyThread2();
        t3.start();
    }

    public static void main4(String[] args) {
        MyRunnable t = new MyRunnable();
        new Thread(t).start();
        new Thread(t).start();
        new Thread(t).start();
    }

    // 案例需求：用实现Runnable接口的方式启动一个线程打印1～100的偶数，用继承Thread类的方式启动一个线程打印1～100的奇数，两个线程同时运行。
    public static void main5(String[] args) {
        MyRunnable1 t1 = new MyRunnable1();
        new Thread(t1).start();

        MyThread3 t2 = new MyThread3();
        t2.start();
    }

    // 使用匿名内部类创建线程
    public static void main6(String[] args) {
        new Thread(new Runnable(){
            @Override
            public void run() {
                for(int i = 2; i <= 100; i+=2){
                    System.out.println(Thread.currentThread().getName()+":"+i);
                }
            }
        }).start();

        new Thread(){
            @Override
            public void run() {
                for(int i = 1; i < 100; i+=2){
                    System.out.println(getName()+":"+i);
                }
            }
        }.start();
    }

    // 使用多线程模拟两个售票窗口，共同出售100张票。两个线程分别命名为普通窗口和紧急窗口。
    // 获取主线程的优先级查看其是否是NORM_PRIORITY，并且把紧急窗口线程的优先级设置为MAX_PRIORITY，把普通窗口的线程优先级设置为MIN _PRIORITY。
    // 启动线程，实现两个窗口同时售票，请观察效果。
    public static void main7(String[] args) {
        Runnable runnable = new Runnable(){
            private int ticket = 100;
            @Override
            public void run() {
                while(true){
                    if(ticket <= 0){
                        System.out.println("售罄！");
                        break;
                    }

                    System.out.println(Thread.currentThread().getName()+":"+"当前还剩"+(--ticket)+"张票");
                }
            }
        };

        Thread t1 = new Thread(runnable, "紧急窗口");
        Thread t2 = new Thread(runnable, "普通窗口");

        t1.setPriority(Thread.MAX_PRIORITY);
        t2.setPriority(Thread.MIN_PRIORITY);

        System.out.println(t1.getName()+":"+t1.getPriority());
        System.out.println(t2.getName()+":"+t2.getPriority());
        System.out.println("主线程的优先级别:"+Thread.currentThread().getPriority());

        t1.start();
        t2.start();
    }

    public static void main8(String[] args) {
        for(int i = 10; i >= 1; i--){
            System.out.println(i);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("新年快乐！");
    }

    // 案例：线程让步，使用 yield 方法
    // 线程让步yield方法只是让当前线程暂停一下，让系统的线程调度器重新调度一次，
    // 希望优先级与当前线程相同或更高的其他线程能够获得执行机会，但是这种情况不能保证执行。
    // 完全有可能的情况是，当某个线程调用yield方法暂停后，线程调度器又将其调度出来重新执行。
    public static void main9(String[] args) {
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                for(int i = 1; i <= 6; i++){
                    System.out.println(Thread.currentThread().getName()+":"+i);
                    Thread.yield();
                }
            }
        };

        Thread t1 = new Thread(runnable, "高");
        Thread t2 = new Thread(runnable, "低");

        t1.setPriority(Thread.MAX_PRIORITY);
        t2.setPriority(Thread.MIN_PRIORITY);

        t1.start();
        t2.start();
    }

    //案例需求：编写龟兔赛跑多线程程序。
    // 假设赛跑长度为30米，兔子的速度为10米每秒，兔子每跑完10米后休眠的时间为10秒；
    // 乌龟的速度为1米每秒，乌龟每跑完10米后休眠的时间为1秒。
    // 最后要等兔子和乌龟的线程结束，主线程（裁判）才能公布最后的结果。
    public static void main(String[] args) {
        
    }
}
